﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace DataAccessComponents
{
    /// <summary>
    /// Klasa odzwierciedla tabele "Hotele" w bazie danych
    /// </summary>
   public class Hotel : IDataErrorInfo
    {
        private bool czy_zmiana;

        public bool Czy_zmiana
        {
            get { return this.czy_zmiana; }
            set { this.czy_zmiana = value; }
        }

        /// <summary>
        /// Id hotelu 
        /// </summary>
        private int id_hotelu;

        public int Id_hotelu
        {
            get { return this.id_hotelu; }
            set { this.id_hotelu = value; }
        }

        /// <summary>
        /// Nazwa hotelu
        /// </summary>
        private string nazwa;

        public string Nazwa
        {
            get { return this.nazwa; }
            set { this.nazwa = value; this.czy_zmiana = true; }
        }

        /// <summary>
        /// Opis hotelu
        /// </summary>
        private string opis;

        public string Opis
        {
            get { return this.opis; }
            set { this.opis = value; this.czy_zmiana = true; }
        }

        /// <summary>
        /// Opis skrócony
        /// </summary>
        private string opis_skrot;

        public string Opis_skrot
        {
            get { return opis_skrot; }
            set { opis_skrot = value; }
        }

        /// <summary>
        /// ID galerii zawierającej zdjecia danego hotelu
        /// </summary>
        private int id_galeria;

        public int Id_galeria
        {
            get { return this.id_galeria; }
            set { this.id_galeria = value; }
        }

        /// <summary>
        /// Obiekt Galeria zawierający informacje o galeri dla danego hotelu
        /// </summary>
        private Galeria galeria;

        public Galeria Galeria
        {
            get { return this.galeria; }
            set { this.galeria = value; this.czy_zmiana = true; }
        }

        /// <summary>
        /// Zdjecie główne hotelu
        /// </summary>
        private BitmapImage zdjecieGlowne;

        public BitmapImage ZdjecieGlowne
        {
            get { return zdjecieGlowne; }
            set { zdjecieGlowne = value; }
        }

        /// <summary>
        /// Zdjecie główne miasta
        /// </summary>
        private int idzdjecieGlowne;

        public int IdzdjecieGlowne
        {
            get { return idzdjecieGlowne; }
            set { idzdjecieGlowne = value; }
        }

        /// <summary>
        /// Id miasta w którym znajduje się hotel
        /// </summary>
        private int id_miasta;

        public int Id_miasta
        {
            get { return this.id_miasta; }
            set { this.id_miasta = value; this.czy_zmiana = true; }
        }

       /// <summary>
       /// Obiekt Miasto zawierjący informacje o mieście
       /// </summary>
        private Miasto miasto;

        public Miasto Miasto
        {
            get { return this.miasto; }
            set { this.miasto = value; this.czy_zmiana = true; }
        }

        /// <summary>
        /// Id wyzywienia
        /// </summary>
        private int id_wyzywienie;

        public int Id_wyzywienie
        {
            get { return this.id_wyzywienie; }
            set { this.id_wyzywienie = value; }
        }

        private Wyzywienie wyzywienie;

        public Wyzywienie Wyzywienie
        {
            get { return wyzywienie; }
            set { wyzywienie = value; }
        }

        /// <summary>
        /// standard który posiada hotel
        /// </summary>
        private string standard;

        public string Standard
        {
            get { return this.standard; }
            set { this.standard = value; this.czy_zmiana = true; }
        }
        
        /// <summary>
        /// Adres obrazka przedstawiającego standard hotelu
        /// </summary>
        private string obrazek_standard;

        public string Obrazek_standard
        {
            get { return "Resources/"+this.standard+".png"; }
            set { this.obrazek_standard = value; this.czy_zmiana = true; }
        }

        /// <summary>
        /// Najbliższy termin dla hotelu
        /// </summary>
        private int id_termin;

        public int Id_termin
        {
            get { return id_termin; }
            set { id_termin = value; }
        }

        private Termin termin;

        public Termin Termin
        {
            get { return termin; }
            set { termin = value; }
        }
        /// <summary>
        /// Konstruktor tworzący obiekt Hotel
        /// </summary>
        /// <param name="ih">Id hotelu</param>
        /// <param name="naz">Nazwa hotelu</param>
        /// <param name="op">Opis hotelu</param>
        /// <param name="ig">Id galeri hotelu</param>
        /// <param name="im">Id miasta w którym znajduje się hotel</param>
        /// <param name="st">Standard hotelu</param>
        /// <param name="wyz">Wyzywienie</param>
        public Hotel(int ih, string naz, string op, int ig, int im,string st,Miasto miasto,Galeria galeria,int wyz)
        {
            this.id_hotelu = ih;
            this.nazwa = naz;
            this.opis = op;
            this.id_galeria = ig;
            this.id_miasta = im;
            this.standard = st;
            this.miasto = miasto;
            this.galeria = galeria;
            this.id_wyzywienie = wyz;
            this.zdjecieGlowne = new BitmapImage();
            this.idzdjecieGlowne = 0;
            this.wyzywienie = new Wyzywienie();
            this.opis_skrot = "";
            this.id_termin = 0;
            this.Termin = new Termin();
        }

        public Hotel()
            : this(0, "", "", 0, 0,"",new Miasto(),new Galeria(),0)
        { }


        public string Error
        {
            get { return string.Empty; }
        }

        public string this[string propertyName]
        {
            get {
                string result = string.Empty;
                propertyName = propertyName ?? string.Empty;

                if (propertyName == "Nazwa")
                {

                    if (string.IsNullOrEmpty(this.Nazwa))
                    {
                        result = "Pole \"Nazwa\" nie może być puste";
                    }
                    else if (Regex.IsMatch(this.Nazwa, @"[@£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,.:;<=>§?]+"))
                    {
                        result = "Pole \"Nazwa\" zawiera niedozwolone znaki";
                    }

                }
                else if (propertyName == "Standard")
                {
                    if (string.IsNullOrEmpty(this.Standard))
                    {
                        result = "Pole \"Standard\" nie może być puste";
                    }
                    else if (Regex.IsMatch(this.Standard, @"[@£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,-.:;<=>§?]+"))
                    {
                        result = "Pole \"Standard\" zawiera niedozwolone znaki";
                    }
                }
                

                return result;
            }

        }
    }
}
